package 代码记录.指定公司代码练习记录.腾讯云智.算法21年;

/**
 * @author zx
 * @create 2023-03-13 16:41
 */
public class 把字符串转换成整数 {
    /**
     * @return 感觉这种做法我想不到
     */
    public int strToInt(String str) {
        char[] arr = str.trim().toCharArray();//去前后空格
        if (arr.length == 0) {
            return 0;
        }
        //记录第一个符合是否为负数
        boolean flag = false;
        //开始遍历的位置
        int i = 1;
        //如果首个非空格字符为负号,那么从位置1开始遍历字符串,并且结果需要变成负数
        if (arr[0] == '-') {
            flag = true;
        } else if (arr[0] != '+') {//如果首个非空格字符不是负号也不是加号,那么从第一个元素开始遍历
            i = 0;
        }
        int limit = Integer.MAX_VALUE / 10;
        int res = 0;
        for (int j = i; j < arr.length; j++) {
            //遇到非数字直接退出
            if (arr[j] > '9' || arr[j] < '0') {
                break;
            }
            if (res > limit || (res == limit && arr[j] > '7')) {
                //根据字符串首负号判断返回最大值还是最小值
                return flag == false ? Integer.MAX_VALUE : Integer.MIN_VALUE;
            }
            //字符获取数字需要 - '0' 的位移
            res = res * 10 + (arr[j] - '0');
        }
        if(flag){
            res = -res;
        }
        return res;
    }

    /**
     * @return 我的暴力做法--通过测试用例：1074 / 1080
     * 顶多只能想到这种做法
     */
    public static int strToInt2(String str) {
        String s = str.trim();
        boolean isFu = false;
        if(s.length() == 0){
            return 0;
        }
        if(s.charAt(0) == '-'){
            isFu = true;
        }
        long res = 0;
        if(s.charAt(0) >= '0' && s.charAt(0) <= '9'){
            res = res * 10 + (s.charAt(0) - '0');
        }
        if(s.charAt(0) != '-' && s.charAt(0) != '+' && !(s.charAt(0) >= '0' && s.charAt(0) <= '9')){
            return 0;
        }
        for(int i = 1;i < s.length();i++){
            if(!(s.charAt(i) >= '0' && s.charAt(i) <= '9')){
                break;
            }
            if(s.charAt(i) >= '0' && s.charAt(i) <= '9'){
                res = res * 10 + (s.charAt(i) - '0');
            }
        }
        if(isFu){
            res = -res;
        }
        if(res > Integer.MAX_VALUE){
            return Integer.MAX_VALUE;
        }
        if(res < Integer.MIN_VALUE){
            return Integer.MIN_VALUE;
        }
        return (int)res;
    }
}
